﻿using Boxman.Properties;
using Common;
using System;
using System.Windows.Forms;

namespace Boxman {
    // 主窗口
    public partial class MainWindow: Form, Game.Callback {
        private readonly Game mGame;   // 游戏

        /**
         * 构造方法。
         */
        public MainWindow() {
            // 初始化控件
            this.InitializeComponent();

            // 设置状态栏
            LabelLevel.Text = string.Format(Resources.IDS_LEVEL, 1);
            LabelMoveCount.Text = string.Format(Resources.IDS_MOVE_COUNT, 0);

            // 创建游戏区域
            GameBoard gameBoard = new GameBoard(this.Controls, 0, MainMenu.Height, Const.GAME_BOARD_WIDTH, Const.GAME_BOARD_HEIGHT);

            // 创建游戏
            mGame = new Game(this, gameBoard.Drawer, gameBoard);
        }

        /**
         * "重玩本关"菜单项的单击响应方法。
         * @param sender    事件发送者
         * @param e         事件相关信息
         */
        private void MenuItemRestart_Click(object sender, EventArgs e) {
            mGame.Restart();
        }

        /**
         * "选关"菜单项的单击响应方法。
         * @param sender    事件发送者
         * @param e         事件相关信息
         */
        private void MenuItemSelectLevel_Click(object sender, EventArgs e) {
            // 显示输入窗口
            string tipText = string.Format(Resources.IDS_PLEASE_INPUT_NUMBER, 1, Const.LEVEL_COUNT);
            int level = InputBox.GetIntValue(mGame.Level, Const.LEVEL_COUNT, 1, tipText);

            // 进入关卡
            if (level != mGame.Level) {
                mGame.GotoLevel(level);
            }
        }

        /**
         * "回退"菜单项的单击响应方法。
         * @param sender    事件发送者
         * @param e         事件相关信息
         */
        private void MenuItemUndo_Click(object sender, EventArgs e) {
            mGame.Undo();
        }

        /**
         * 进入关卡事件的响应方法。
         * @param level    关卡数
         */
        public void OnGotoLevel(int level) {
            LabelLevel.Text = string.Format(Resources.IDS_LEVEL, level);
            LabelMoveCount.Text = string.Format(Resources.IDS_MOVE_COUNT, 0);
        }

        /**
         * 小人移动事件的响应方法。
         * @param moveCount    小人移动次数
         */
        public void OnManMoved(int moveCount) {
            LabelMoveCount.Text = string.Format(Resources.IDS_MOVE_COUNT, moveCount);
        }

        /**
         * 游戏结束事件的响应方法。
         * @param allOver   全部通关则为 true，否则为 false
         */
        public void OnGameOver(bool allOver) {
            if (allOver) {
                MessageBox.Show(Resources.IDS_WON_ALL_OVER, " ", MessageBoxButtons.OK, MessageBoxIcon.Information);
            } else {
                MessageBox.Show(Resources.IDS_WON, " ", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        /**
         * 按键事件的响应方法。
         * @param msg   事件
         * @param key   按键
         * @return 事件在此被处理则返回 true，否则返回 false
         */
        protected override bool ProcessCmdKey(ref Message msg, Keys key) {
            return mGame.OnKeyPressed(key);
        }
    }
}
